// Promise 代表异步求值的过程和结果

// example 01
// const p = new Promise((resolve, reject) => {
//   resolve(100);
// }).then((res) => {
//   console.log(res);
// });

// example 02
// const p = new Promise((resolve, reject) => {
//   resolve(100);
// })
//   .then((res) => {
//     console.log(res);
//     return "abc"; // 相当于return了一个以求值的promise
//   })
//   .then((res) => {
//     console.log(res);
//   });

// example 03
function wait(data, ms = 1000) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(data);
    }, ms);
  });
}

// const p = new Promise((resolve, reject) => {
//   resolve(100);
// })
//   .then((res) => {
//     console.log(res);
//     return wait("abc", 2000);
//   })
//   .then((res) => {
//     console.log(res);
//   });

// example 04
// const p = new Promise((resolve, reject) => {
//   reject("some error");
// })
//   .then((res) => {
//     console.log(res);
//   })
//   .catch((err) => {
//     console.warn(err);
//   })
//   .then((res) => {
//     console.log("here ---");
//   });

// example 05
// await 只能求成功的值， 求失败的值会报错， 最好try catch一下
// async function foo() {
//   console.log("begin");
//   const one = await wait(1, 1000);
//   console.log("-- tick1 --");
//   const two = await wait(2, 1000);
//   console.log("-- tick2 --");

//   const x = await Promise.resolve(100);
//   console.log(x);

//   try {
//     const y = await Promise.reject("err");
//     console.log(y);
//   } catch (err) {
//     console.log(err);
//   }
// }

// foo().then((res) => {
//   console.log("finished", res);
// });

// example 06
Promise.all([wait(1, 200), wait(2, 3000)]).then((res) => {
  console.log(res);
});

Promise.race([wait(1, 200), wait(2, 100)]).then((res) => {
  console.log("race", res);
});
